package reflect;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;

/**
 * 通过反射获取方法对象，然后动态调用方法
 */
public class MethodDemo01 {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        ArrayList<String> list=new ArrayList<>();
        list.add("100");
        list.add("200");
        //下面的整数300不能直接存储到集合
        //因为List的泛型为类型String
        //但是，泛型仅仅在编译阶段有效。
        //list.add(300);
        //list.add(0,300);
        //通过反射技术将300这个整数写入到list集合;
        //1.获取字节码对象
        Class<?> cls=list.getClass();
        //2.获取add方法对象(类型为Method类型)
        //Method method = cls.getDeclaredMethod("add", Object.class);
        Method method = cls.getDeclaredMethod("add",int.class,Object.class);
        //3.动态执行方法对象(可以调用Method的invoke方法)
        //method.invoke(list,300);//这里表示调用list集合的add方法，传入整数300
         method.invoke(list,0,300);
        //4.最后输出list集合内容
        System.out.println(list);
    }
}
